package model;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

public class AlgoritmoMasAreasEnComunTestCase extends TestCase {

	private AlgoritmoMasAreasEnComun algo1 = new AlgoritmoMasAreasEnComun();
	private List<String> areasUser1 = new ArrayList<String>();
	private List<String> areasUser2 = new ArrayList<String>();
	private List<String> areasUser3 = new ArrayList<String>();
	private List<String> areasUser4 = new ArrayList<String>();
	private List<String> areasUser5 = new ArrayList<String>();
	private List<String> areasTp = new ArrayList<String>();
	private Trabajo tpMock = mock(Trabajo.class);
	private CFP cfpMock = mock(CFP.class);
	private List<Usuario> usuariosCFP = new ArrayList<Usuario>();
	private Usuario user1 = mock(Usuario.class);
	private Usuario user2 = mock(Usuario.class);
	private Usuario user3 = mock(Usuario.class);
	private Usuario user4 = mock(Usuario.class);
	private Usuario user5 = mock(Usuario.class);
	private SistemaWeb sistema = mock(SistemaWeb.class);
	private List<Trabajo> trabajos = new ArrayList<Trabajo>();

	public void setUp() throws Exception {

		areasUser1.add("a");
		areasUser1.add("b");
		areasUser1.add("c");
		areasUser1.add("d");
		areasUser1.add("f");
		areasUser1.add("e");

		areasUser2.add("a");
		areasUser2.add("d");
		areasUser2.add("c");
		areasUser2.add("d");
		areasUser2.add("e");

		areasUser3.add("t");
		areasUser3.add("l");

		areasUser4.add("x");

		areasTp.add("a");
		areasTp.add("b");
		areasTp.add("c");
		areasTp.add("d");
		areasTp.add("e");
		areasTp.add("f");
		areasTp.add("g");
		areasTp.add("h");

		usuariosCFP.add(user1);
		usuariosCFP.add(user2);
		usuariosCFP.add(user3);
		usuariosCFP.add(user4);

		trabajos.add(tpMock);

	}

	public void testEjecutateHayRevisoresCapaces() {

		areasUser5.add("c");
		areasUser5.add("d");
		areasUser5.add("g");
		areasUser5.add("e");
		areasUser5.add("a");
		usuariosCFP.add(user5);

		when(cfpMock.getListaDeRevisores()).thenReturn(usuariosCFP);
		when(cfpMock.getTrabajos()).thenReturn(trabajos);

		when(tpMock.getAreasInteres()).thenReturn(areasTp);

		when(user1.getAreasDeExperiencia()).thenReturn(areasUser1);
		when(user2.getAreasDeExperiencia()).thenReturn(areasUser2);
		when(user3.getAreasDeExperiencia()).thenReturn(areasUser3);
		when(user4.getAreasDeExperiencia()).thenReturn(areasUser4);
		when(user5.getAreasDeExperiencia()).thenReturn(areasUser5);


		this.algo1.ejecutate(cfpMock, sistema);

		verify(cfpMock).getListaDeRevisores();
		verify(cfpMock).getTrabajos();
		verify(sistema).enviarMail(user1, tpMock);
		verify(sistema).enviarMail(user2, tpMock);
		verify(sistema).enviarMail(user5, tpMock);

	}

	public void testEjecutateSeAgreganAlgunosQueSabenPoco() {

		when(cfpMock.getListaDeRevisores()).thenReturn(usuariosCFP);
		when(cfpMock.getTrabajos()).thenReturn(trabajos);

		when(tpMock.getAreasInteres()).thenReturn(areasTp);

		when(user1.getAreasDeExperiencia()).thenReturn(areasUser1);
		when(user2.getAreasDeExperiencia()).thenReturn(areasUser2);
		when(user3.getAreasDeExperiencia()).thenReturn(areasUser3);
		when(user4.getAreasDeExperiencia()).thenReturn(areasUser4);
		when(user5.getAreasDeExperiencia()).thenReturn(areasUser5);


		this.algo1.ejecutate(cfpMock, sistema);

		verify(cfpMock).getListaDeRevisores();
		verify(cfpMock).getTrabajos();
		verify(sistema).enviarMail(user1, tpMock);
		verify(sistema).enviarMail(user2, tpMock);
		verify(sistema).enviarMail(user3, tpMock);

	}

}
